package org.example

import java.text.SimpleDateFormat
import java.util.Date

import org.apache.spark.sql.functions._
import org.apache.spark.sql.{Column, DataFrame, SparkSession}

object Homework {
  def main(args: Array[String]): Unit = {
    val sparkSession: SparkSession = SparkSession.builder()
      .master(master = "local[4]")
      .appName(name = "DataFromMysql")
      .getOrCreate()
    val data1: DataFrame = sparkSession.read
      .format(source = "jdbc")
      .option("url", "jdbc:mysql://localhost:3306/city")
      .option("dbtable", "goods")
      .option("user", "root")
      .option("password", "root")
      .load()
    val data2: DataFrame = sparkSession.read
      .format(source = "jdbc")
      .option("url", "jdbc:mysql://localhost:3306/city")
      .option("dbtable", "deal")
      .option("user", "root")
      .option("password", "root")
      .load()
    val data_Join: DataFrame = data1.join(data2, Seq("gid"))
    println("=================获取数据=====================")
    //    （1）相同商品类型的总数量分别是多少：
    data1.groupBy("gtype").count().show()
    data1.groupBy("gtype").sum("gnum").show()
    //    （2）相同产地的商品名称及数量分别：
    data1.groupBy(data1("gplace"), data1("gname")).sum("gnum").orderBy("gplace").show()
    //    （3）查询前7天入库产品的数量；
    data1.orderBy("gtime").show(7)
    //    （4）相同类型商品的最高入库的时间；
    val map = Map("gtime" -> "max")
    data1.orderBy("gtime").groupBy("gtype").agg(map).show()
    //    （5）查找所有订单的商品信息；
    data_Join.selectExpr("gid", "gname", "gtype", "gplace", "gprice", "gtime", "gnum").distinct().show()
    //    （6）查找当天入库的商品，是否满足当前的订单需要：
    val time = new Date().getTime
    val format = new SimpleDateFormat("yyyy-MM-dd")
    val nowTime = format.format(time) + "%"
    val data3: DataFrame = data_Join.filter(data_Join("gtime").like(nowTime))
      .groupBy("gid", "gname", "gnum").sum("bnum")
    val conditionColumn: Column = when(data3("gnum") - data3("sum(bnum)") >= 0, "足够")
      .otherwise("不够")
    data3.select(data3("gid"), data3("gname"), conditionColumn.as("是否足够")).show()
    //    （7）查看订单中相同商品产地相同的数量；
    data_Join.groupBy("gid", "gplace").count().show()
  }
}
